11
תגובות
$cookies = array();
foreach ($_COOKIE as $key => $value) {
  $cookies[] = "$key=$value";
}
$cookies = implode('; ', $cookies);
$curl_handle = curl_init("url");
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_handle, CURLOPT_COOKIESESSION, true);
curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl_handle, CURLOPT_COOKIE, $cookies);
$result = curl_exec($curl_handle);
curl_close($curl_handle);
die($result);

אני מנסה להציג למשתמש עמוד אחר מהאתר שלי.
התוכן של העמוד תלוי בעוגיות של המשתמש, לכן אני גם שולח את כל העוגיות של המשתמש עם ה-request.
משום מה, הדף נטען במשך 10-15 שניות ומחזיר שגיאה 500...

למה זה קורה ואיפה טעיתי כאן.
חשוב לציין שזו הפעם הראשונה שאני מתעסק עם curl...


תודה.

11 תשובות

avatar ענה אנונימי ב 30 לנובמבר 2011 #

למה curl ?
אני בטוח שיש דרך טובה יותר (include)..

avatar ענה iiddaannyy ב 30 לנובמבר 2011 #

include לא בא בחשבון במקרה הזה.
בעמוד שאני רוצה להציג יש require לעמודים שכבר עשיתי להם require וזה ייצור בלגן.
בקיצור, לא Include.
לפני זה השתמשתי ב-file_get_contents והעברתי דרך ה-get את העוגיות מוצפנות והצלחתי לעבוד איתן דרך ה-get.
אבל דרך ה-curl זה נקי יותר.

avatar ענה אנונימי ב 30 לנובמבר 2011 #

curl הרבה יותר איטית והרבה יותר משאבים.
עדיף לך להעתיק את הדף ולא להשתמש ב CURL לקקבצים בתוך השרת.

avatar ענה iiddaannyy ב 30 לנובמבר 2011 #

זה דף שמשתנה, אני לא יכול להעתיק אותו.
מה שמסבך עוד יותר, זה שמדובר בכמה דפים, כשכל פעם אני מציג דף אחר.

avatar ענה אנונימי ב 30 לנובמבר 2011 #

אז במקום לבנות את המערכת אתה בונה קביים עקומות ?
בכל אופן למה לא עובד לך אני לא יודע. שגיאה 500 אפשר לבדוק בלוגים, כנראה טיימאות.
תוודא שה url נכון.

שנית, קוקי מופרדים בנקודה פסיק בלי רווח ביניהם, ול value יש לעשות urlencode

avatar ענה iiddaannyy ב 01 לדצמבר 2011 #

לא הבנתי איך קשור מה שאני מבקש למערכת. זה הכרחי.
בנוסף, ציטוט מ-php.net:

The contents of the "Cookie: " header to be used in the HTTP request. Note that multiple cookies are separated with a semicolon followed by a space (e.g., "fruit=apple; colour=red")

ככה שדווקא צריך את הרווח.

ואני גם לא יודע למה יש שגיאה 500, בלוגים לא מופיע משהו מיוחד.
וגם אם זה טיימאאוט, זה לא אמור לקרות.


*כשהעברתי את הקוד לדף אחר הוא עבד.

avatar ענה fingerbang ב 01 לדצמבר 2011 #

אם הגעת לבעיה כזאת אתה צריך לחשוב אם אתה מתכנן את הקוד שלך נכון.

בכל מקרה תעבור להשתמש בinclude_once ו require_once

avatar ענה iiddaannyy ב 01 לדצמבר 2011 #

הקוד מתוכנן נכון, בוא אני אסביר לך איך אני עובד.
יש לי תיקייה classes שבה יש קבצים עם מחלקות שונות.
אחת מהמחלקות נקראת redirect, דרכה אני מעביר ממשתמש לעמוד אחר/לעמוד שגיאה.
לדוגמה אם אני מעוניין שהמשתמש יראה דף 404, במחלקה יש מתודה שמטלת בזה.
זו המתודה:

$header = array(
  200 => 'OK',
  301 => 'Moved Permanently',
  403 => 'Forbidden',
  404 => 'Not Found',
  500 => 'Internal Server Error'
);
if (isset($header[$errorNumber]))
  header("HTTP/1.1 $errorNumber $header[$errorNumber]");
$cookies = array();
foreach ($_COOKIE as $key => $value) {
  $cookies[] = "$key=$value";
}
$cookies = implode('; ', $cookies);
$ch = curl_init("http://web-school.co.il/error/404.php");
curl_setopt($ch, CURLOPT_COOKIE,$cookies);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
die($result);

errorNumber$ זה מספר השגיאה שאליה אני מעביר את המשתמש.

עכשיו הבעיה היא שכשאני מפעיל את המתודה הזו זה טוען לי את העמוד 10 שניות בערך ושולח אותי לשגיאה 500.

avatar ענה iiddaannyy ב 01 לדצמבר 2011 #

אם אני לא שולח את העוגיות, כלומר אם אני מוחק את השורה:

curl_setopt($ch, CURLOPT_COOKIE,$cookies);

זה עובד.
הבעיה היא שאני חייב להעביר את העוגיות.

avatar ענה אנונימי ב 02 לדצמבר 2011 #

למה אתה עושה ככה ולא שולח הדר של הפניה?

header("HTTP/1.1 $errorNumber $header[$errorNumber]");
header("Location: {$PATH}/{$errorNumber}.html");

avatar ענה iiddaannyy ב 02 לדצמבר 2011 #

המטרה היא להציג למשתמש שגיאה 404.
שזה ייראה כאילו העמוד באמת לא קיים.
כשהמשתמש רואה שהוא מועבר לעמוד 404 הוא מבין שהעמוד אליו הוא מנסה להגיע באמת קיים, אבל העבירו אותו.
אם הוא רואה 404 ללא העברה, זה נראה כאילו העמוד באמת לא קיים.